<?php

namespace App\Http\Controllers\Order;

use App\Http\Controllers\Api\BonusController;
use App\Http\Controllers\Controller;
use App\Models\Business\Business;
use App\Models\Business\BusinessTime;
use App\Models\Business\Food;
use App\Models\Order\BusinessCart;
use App\Models\Order\Cart;
use App\Models\Order\Order;
use App\Models\Order\OrderFlavor;
use App\Models\Order\OrderGoods;
use App\Models\User\Bonus;
use App\Models\User\BonusRecord;
use App\Models\User\BusinessMessage;
use App\Models\User\BusinessSocket;
use App\Models\User\UserMessage;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Validator;
use App\Models\Api\Files;

/**
 * @group 订单接口
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class OrdersController extends Controller
{
    /**
     * 订单查看接口,用户只能查看自己的订单,商户可以查看商户上面所有的订单,管理员可以查看所有订单
     * 返回值
     *
     * 400 参数错误
     * 前端逻辑 该接口分三类用户使用
     *
     * 1. 用于只能看自己的订单
     * 2. 商家只能看属于商家的订单
     * 3. 后台管理员可以看所有的订单
     *
     * @queryParam id 订单主键
     * @queryParam no 订单流水号
     * @queryParam total_fee 订单总金额
     * @queryParam fee 订单实际金额
     * @queryParam bonus_fee 优惠金额
     * @queryParam pay_status 支付状态 0 1 未支付 已支付
     * @queryParam trans_status 运送状态 1.未配送 2.配送中 3. 配送完成
     * @queryParam status 订单状态 false.未完成 true.订单完成
     * @queryParam accept 商家是否接单 false:未接单 true:已接单 2:已拒单
     * @queryParam is_confirm 用户是否已经确定下单
     * @queryParam is_revoke 用户撤销的订单 撤销的订单就无用了
     * @queryParam active 订单是否正式被撤销 1 正常状态 0被撤销
     * @queryParam order_goods 数组表示订单中的购买商品情况 （数组）
     * @queryParam order_goods->num 该商品购买数量
     * @queryParam order_goods->price 该商品下单的时候的单价
     * @queryParam order_goods->goods 该商品的详细信息 具体字段和商品信息一模一样
     * @queryParam business 商家信息 字段说明和商家信息接口一模一样
     *
     *
     * @bodyParam no string optional 通过订单号模糊查询订单
     * @bodyParam phone string optional 通过手机号模糊查询订单
     * @bodyParam bonus string optional 通过代金券编号查询订单
     * @bodyParam name string optional 通过用户姓名查询订单
     * @bodyParam date string optional 通过消费日期查询订单
     *
     * @bodyParam accept int optional 商家是否接单
     * @bodyParam status int optional 订单是否完成
     */

    public function index(Request $request){

//        //数据验证
        $validator = Validator::make($request->all(), genValidate());
        if ($validator->fails()) {
            return response()->json(encodeMsg($validator->errors()->messages(), 400), 400);
        }
        //用户只能查看自己的订单
        if($request->user_type == 1) {
            $data = Order::with(['order_goods', 'business'])->where(
                function ($q) use($request){
                    $q->where('user_id','=',$request->user_id);
                    $q->where('user_delete','=',0);
                })->orderBy('id', 'desc')->get();
        }

        if($request->user_type == 2){
            $data = Order::where(
                    function ($q) use($request){
                        $q->where('business_id','=',$request->user_id);
                        $q->where('business_delete','=',0);
                        $request->has('accept') && $q->where('accept','=',$request->get('accept'));
                        $request->has('status') &&$q->where('status','=',$request->get('status'));
                        $request->has('phone') && $q->where('phone','like',"%{$request->get('phone')}%");
                        $request->has('no') && $q->where('no','like',"%{$request->get('no')}%");
        })->with('order_goods','business','bonus')->orderBy('id', 'asc')->get()->toArray();
            //修改前端商品显示
            foreach ($data as $k =>$v){
                $row ="";
                foreach ($data[$k]['order_goods'] as $key =>$value){
                    $row.=$value['goods']['name']."x".$value['num']." ";
                }
                $data[$k]['order_goods']=$row;
                if ($data[$k]['bonus'] ==null){
                    $data[$k]['bonus']=array('no'=>null);
                }
                if ($request->has('bonus')){
                    if (strstr($data[$k]['bonus']['no'], $request->get('bonus'))==false){
                        unset($data[$k]);
                    }
                }
            }
            //获取订单个数
            $accept=Order::where(
                function ($q) use($request){
                $q->where('accept','=',0);
                $q->where('business_delete','=',0);
            })->count();
            $incomplete=Order::where(
                function ($q) use($request){
                    $q->where('accept','=',1);
                    $q->where('status','=',0);
                    $q->where('business_delete','=',0);
                })->count();

            $res = ['data'=>$data,'accept'=>$accept,'incomplete'=>$incomplete];
            return response()->json($res,200);
        }
        if($request->user_type == 3){
            $data = Order::with('order_goods','bonus','business','user')->orderBy('id', 'desc');
            $data=pageQuery($data,$request)->toArray();
            //修改前端商品显示
            foreach ($data['data'] as $k =>$v){
                $row ="";
                foreach ($data['data'][$k]['order_goods'] as $key =>$value){
                    $row.=$value['goods']['name']."x".$value['num']." ";
                }
                if ($data['data'][$k]['bonus'] ==null){
                    $data['data'][$k]['bonus']=array('no'=>null);
                }
                $data['data'][$k]['order_goods']=$row;
            }
            return response()->json($data,200);
        }
        return response()->json($data);

    }


    /**
     * 订单查看接口,用户只能查看自己的订单,商户可以查看商户上面所有的订单,管理员可以查看所有订单
     * 返回值
     *
     * 400 参数错误
     * 200 成功
     * 414 无该订单数据
     *
     * @queryParam id 订单主键
     * @queryParam no 订单流水号
     * @queryParam total_fee 订单总金额
     * @queryParam fee 订单实际金额
     * @queryParam bonus_fee 优惠金额
     * @queryParam pay_status 支付状态 0 1 未支付 已支付
     * @queryParam trans_status 运送状态 1.未配送 2.配送中 3. 配送完成
     * @queryParam status 订单状态 false.未完成 true.订单完成
     * @queryParam accept 商家是否接单 0:未接单 1:已接单 2:已拒单
     * @queryParam is_confirm 用户是否已经确定下单
     * @queryParam is_revoke 用户撤销的订单 撤销的订单就无用了 0. 用户未撤销订单 1. 用户成功撤销订单 2. 用户申请撤销订单 但是商家未同意 3. 商家不同意撤单 用户可以重新申请
     * @queryParam active 订单是否正式被撤销 1 正常状态 0被撤销
     * @queryParam order_goods 数组表示订单中的购买商品情况 （数组）
     * @queryParam order_goods->num 该商品购买数量
     * @queryParam order_goods->price 该商品下单的时候的单价
     * @queryParam order_goods->goods 该商品的详细信息 具体字段和商品信息一模一样
     * @queryParam business 商家信息 字段说明和商家信息接口一模一样
     */

    public function show(Request $request,$pk){

        //数据验证
        $validator = Validator::make($request->all(), genValidate());
        if ($validator->fails()) {
            return response()->json(encodeMsg($validator->errors()->messages(), 400), 400);
        }
        if($request->user_type == 1) {
            $data = Order::with(['order_goods','business'])->where(['user_id'=>$request->user_id,'id'=>$pk,'user_delete'=>0])->get();
        }
        if($request->user_type == 2) {
            $data = Order::with(['order_goods','business'])->where(['business_id'=>$request->user_id,'id'=>$pk,'business_delete'=>0])->get()->toArray();
            foreach ($data as $k =>$v){
                $row =array();
                foreach ($data[$k]['order_goods'] as $key =>$value){
                    $r=$value['goods']['name']."x".$value['num'];
                    array_push($row,$r);
                }
                $data[$k]['order_goods']=$row;
            }
            return response()->json($data,200);

        }
        if($request->user_type == 3) {
            $data = Order::with(['order_goods','business'])->where(['id'=>$pk])->get();
        }

        if(sizeof($data) == 0){
            return response()->json($data,414);
        };
        return response()->json($data,200);
    }

    /**
     * 用户下单(生成实际订单,还未确认,不会给商家发单,需要通过修改接口确认下单)
     * 前端流程
     * 前端通过购物车查看模块 提交用户要购买的商品和数量 保证商品都在同一家店铺中
     *
     * 后端流程
     * 检查商品是否都在同一家商户
     * 检查商品库存
     * 检查商家是否在营业时间
     * 检查商家是否可以使用购物券
     * 检查用户是否提交购物券
     * 计算购物券后金额
     * 提交订单
     *    消除优惠券
     *    消除购物车
     *
     * 400 参数错误
     * 414 没有找到相关购物车信息 无法下单
     * 415 购物车商品必须属于同一家商家才能下单
     * 416 超过营业时间 无法下单
     * 417 用户提交的优惠券不是自己的优惠券或没有这个优惠券
     * 418 商家目前不能营业
     * 419 商家目前无法使用优惠券
     * 420 商品库存不足 并且返回该库存不足的商品信息
     * 421 传递的cart格式不对
     * 511 系统错误 请联系管理员
     * 512 商品扣除库存时失败 可能商品在下单过程中被商家移除,请重新下单
     *
     * @bodyParam cart string required 购物车编号 同时购买多个商品使用 1,2,3,4 这种方式 这里的1,2,3,4对应购物车接口中的id
     * @bodyParam bonus int optional 用户使用优惠券购买商品 外键 对应优惠券的id号 用户只能使用自己的优惠券来下单
     * @bodyParam desc string optional 备注信息
     * @bodyParam cover int optional 餐具份数 默认0
     * @bodyParam name string optional 收货人姓名
     * @bodyParam phone string optional 收货人手机号
     * @bodyParam address string optional 收货人地址
     */

    public function store(Request $request)
    {
        //数据验证
        $validator = Validator::make($request->all(), genValidate());
        if ($validator->fails()) {
            return response()->json(encodeMsg($validator->errors()->messages(), 400), 400);
        }

        $cartId = $request->get('cart');
        $type = $request->user_type;
        $cartArr = json_decode($cartId);

        if(!is_array($cartArr))
            return response()->json('cart格式错误',421);
    //    if ($type == 1){
            //只允许提交自己的购物车信息
            $cartInfo = Cart::where('user_id', '=', $request->user_id)->whereIn('id', $cartArr)->with('food')->get()->toArray();
    //    }
//        if ($type == 2){
//            //只允许提交自己的购物车信息
//            $cartInfo = BusinessCart::where('business_id', '=', $request->user_id)->whereIn('id', $cartArr)->with('food')->get()->toArray();
//        }
        if (sizeof($cartInfo) === 0) {
            return response()->json('购物车已经被清空', 414);
        }
        //判断商品是否都在同一家商户
        $nextKey = 1;
        $cartIds = [];//把所有的id号移到这里面 后面的代码要用这些id号来清空购物车
        foreach ($cartInfo as $key => $value) {
            if ($nextKey == sizeof($cartInfo)) {
                array_push($cartIds,$cartInfo[sizeof($cartInfo) - 1]['id']);
                break;
            }
            $tmpBusinessId = $value['food']['business_id'];
            $nextTmpBusinessId = $cartInfo[$nextKey]['food']['business_id'];
            if ($tmpBusinessId !== $nextTmpBusinessId) {
                return response()->json('购物车商品必须属于同一家商铺', 415);
            }
            array_push($cartIds,$cartInfo[$key]['id']);
            $nextKey++;
        }
        $businessInfo = $cartInfo[0]['food']['business'];
        //商户状态
        if($businessInfo['status'] != 1)
            return response()->json('该商家已经被停止营业', 418);

        //检查营业时间
        $day = date('w', time());
        $time = date('H:i:s', time());
        $businessId = $businessInfo['id'];
        $businessTime = BusinessTime::where(['business_id' => $businessId, 'day' => $day])
            ->where('start_time', '<=', $time)
            ->where('end_time', '>=', $time)->get()->toArray();
        if ($businessTime === [])
            return response()->json('购物车商品必须属于同一家商铺', 416);
        //检查优惠券
        $bonus_amount = 0;
        if ($request->has('bonus')) {
            //判断商家是否可以使用优惠券
            if($businessInfo['bonus_status'] === 0)
                return response()->json('该商家目前无法使用优惠券',419);
            $bonus = Bonus::where(['user_id' => $request->user_id,'id'=>$request->get('bonus')])->with('record')->get()->toArray();

            if ($bonus === [])
                return response()->json('该用户不拥有这个优惠券', 417);
            $bonus_amount = $bonus[0]['record']['fee'];
        }
        $goods_amount = 0;
        foreach ($cartInfo as $value){
            if($value['food']['food_num'] < $value['num'])
                return response()->json($value['food'],420);
            $goods_amount += $value['num'] * $value['food']['price']+$value['food']['business']['cost'];
        }

        $total_amount = $goods_amount-$bonus_amount < 0 ? 0:$goods_amount-$bonus_amount;
        //user_id','business_id','no','total_fee','fee','bonus_fee','pay_status','trans_status',
        //        'status','accept'
        $no = uniqid();
        $data =[
            'user_id'=>$request->user_id,'business_id'=>$businessId,'no'=>$no,'total_fee'=>$goods_amount,
            'fee'=>$total_amount,'bonus_fee'=>$bonus_amount,'phone'=>'123'
        ];
        //还需要把bonusid加进去
        $request->has('bonus') && $data['bonus_id'] = $bonus[0]['record']['id'];
        $request->has('cover') && $data['cover'] = $request->get('cover');
        $request->has('desc') && $data['desc'] = $request->get('desc');
        $request->has('name') && $data['name'] = $request->get('name');
        $request->has('phone') && $data['phone'] = $request->get('phone');
        $request->has('address') && $data['address'] = $request->get('address');

        //dd($data);
        DB::beginTransaction();
        try {
            $res=Order::create(
                $data
            );
//            if($request->has('flavor')){
//                $flavor=json_decode($request->get('flavor'));
//                foreach ($flavor as $k =>$v){
//                    $da=OrderFlavor::insertGetId(['flavor_id'=>$v,'order_id'=>$res['id']]);
//                    if (!$da){
//                        return response()->json('下单失败 请联系管理员',513);
//                    }
//                }
//            }
            //删除优惠券
            if($request->has('bonus')) {
                $current_bonus = Bonus::find($request->get('bonus'));
                $current_bonus->delete();
            }
            //清空购物车
        //    if ($type ==1){
                Cart::destroy($cartIds);
         //   }
//            if($type ==2){
//               BusinessCart::destroy($cartIds);
//            }
            //dd($cartInfo);
            foreach ( $cartInfo as $value) {
                OrderGoods::create(['order_id'=>$res['id'],'good_id'=>$value['food']['id'],'num'=>$value['num'],'fee'=>
                $value['food']['price']]);

                //扣除商品库存信息
                try {
                    $good = Food::find($value['food']['id']);
                    $leftNum = $good->food_num - $value['num'];
                    if($leftNum < 0){
                        DB::rollBack();
                        return response()->json($good,420);
                    }
                    $good->food_num = $leftNum;
                    $good->save();
                }catch (\Exception $e)
                {
                    DB::rollBack();
                    return response()->json($value['food'],512);
                }
            }
            DB::commit();
            return response()->json($res,200);
        }catch (\Exception $e){
            DB::rollBack();
            return response()->json('下单失败 请联系管理员',511);
        }
    }

    /**
     * 1. 用户确认下单或取消订单接口接口 用户端逻辑
     * 2. 商家收到 确认订单 确认撤销订单 拒绝订单 改变订单运送状态
     *
     * 前端逻辑
     *
     * 确认下单只能是用户在该api中的post方法新增的一个订单,然后确认下单 订单开始配送
     *
     * 取消订单的情况
     *     1. 没有确认下单的订单,把这个订单取消了重新点餐
     *     2. 确认下单,商户未接单
     *     3. 确认下单,但是还没有运输,这时候需要商家同意
     *
     *
     * 前端状态梳理:
     *
     * 1. active=0 订单已经关闭 其中
     *      1. is_revoke=1 active=0 =>用户退单成功 订单已经取消
     *      2. is_finish=1 active=0 =>订单已经完成 状态无法更改
     *      3. is_confirm=0 active=0 => 订单已经取消
     * 2. active=1 订单正在激活状态中 其中
     *      1. is_revoke=2 active=1 =>用户正在申请退单 但是商家还没有确认
     *      2. is_revoke=0 active=1 accept=0 =>订单已经提交 商家还未接单
     *      3. is_revoke=0 active=1 accept=1 tran_status = 1,2,3 商家已经收单 订单状态 1.未配送 2.配送中 3. 配送完成
     *      4. is_revoke=3 active=1 =>商家不同意用户的退单申请
     *
     * 后端逻辑（用户部分）
     *     1. 取消订单返回商品库存
     *     2. 通知商家订单取消
     *
     * 后台逻辑 （商家）
     *  1. 确认收单
     *  2. 开始发货或确认送到货
     *  3. 确认用户退单
     *
     *
     * 用户部分的代码
     * 200下单成功
     *
     * 211 用户撤销订单成功
     * 221 商家操作成功
     * 205商家已经接单 但是没有开始送货 所以已经通知商家确认取消订单 但是目前订单不能取消
     * 411 订单已经下单了 无法再次下单 用户要重新提交一个新订单
     * 412 订单已经被(用户自己)撤销了 无法下单
     * 413 已经在配送的订单 无法撤销
     * 414 该用户没有这个订单 无法下单
     * 415 下单失败 请重新下单
     * 416 申请退单接口发生异常 请重试
     * 500 其他未知情况 系统无法判断 请联系管理员
     * 513 撤销中未知情况 请联系管理员
     * 423 场景 商家想拒绝或接受用户退单但是 1. 订单正在运输中 2.商家并未接受订单(商家没接收订单直接走拒绝接受通过提交accept不用提交revoke字段) 3.用户并未申请退单(并且商家已经接受订单 无法退单) 4. 订单已经在运输 无法退单'
     * 421 该商家无权修改该订单
     * 423 订单已经关闭状态 无法修改
     * 422 商家已经收单 不能再收单了
     * 424 要先确认才能配送订单
     * 425 商家提供的配送状态不是 1 2 3 无法确认
     * 426 要配送完成才能确认完成订单
     * 427 商家确认订单失败 请重试
     * 428 接受退单操作失败 请重试
     * 429 拒绝退单操作失败 请重试
     * 430 订单已经关闭 无限拒绝该订单
     * 431 拒绝订单失败 请重试
     * 432 发货失败 请重试
     * 433 完成订单操作失败
     *
     * @bodyParam confirm int optional 1确认下单 0取消下单（用户端参数）
     * @bodyParam because string optional 撤销原因 (用户端参数)
     * @bodyParam accept int optional 1 商家确认收单 2:已拒单 0 商家拒绝收单(商家后台参数)
     * @bodyParam revoke int optional 1 商家接受用户退单 0 商家不接受用户退单 (商家后台参数)
     * @bodyParam trans_status int optional 1.未配送 2.配送中 3. 配送完成 (商家后台参数)
     * @bodyParam is_finish int optional 1 完成订单 (商家后台参数)
     */
    public function update(Request $request,$pk)
    {

        //数据验证
        $validator = Validator::make($request->all(), genValidate());
        if ($validator->fails()) {
            return response()->json(encodeMsg($validator->errors()->messages(), 400), 400);
        }
    //    $request->user_type = 2;
        //这里是用户退单逻辑
        if($request->user_type == 1) {
            if(Order::where(['user_id' => $request->user_id, 'id' => $pk])->count() < 1)
                return response()->json('该用户无权修改该订单',414);
            $data = Order::find($pk);
            $active = $data->active;
            if ($active == 0) {
                return response()->json('订单已经关闭');
            }
            $confirm = $request->get('confirm');
            if ($confirm == 1) {
                //确认下单 通知商家确认订单 这个时候要等商家方确认
                if (!$data->is_confirm && !$data->is_revoke) {
                    //添加消息通知 消息类型 通知商家有新订单产生
                    DB::beginTransaction();
                    try {
                        BusinessMessage::create(['user_id' => $data->business_id, 'message_code' => 1, 'num' => $data->id]);
                        $data->is_confirm = true;
                        $data->save();
                        DB::commit();
                        return response()->json($data, 200);
                    }catch (\Exception $e){
                        DB::rollBack();
                        return response()->json('确认订单失败 请重试', 427);
                    }
                } elseif (!$data->is_revoke && $data->is_confirm) {
                    return response()->json('该订单已经下单', 411);
                } elseif ($data->is_revoke) {
                    return response()->json('该订单已经撤销', 412);
                } else {
                    return response()->json('撤销失败未知情况', 513);
                }

            } else {
                //退单 用户未确认下单 直接取消订单
                if (!$data->is_confirm) {
                    $data->is_revoke = true;
                    $data->active = false;
                    $data->status = 1;
                    $data->finish_time = date("Y-m-d H:i:s");
                    $data->save();
                    $this->backBonus($pk);
                    return response()->json($data, 204);
                } elseif (!$data->accept && $data->is_confirm) {
                    //商家还未接单 直接退单
                    $data->is_revoke = true;
                    $data->active = false;
                    $data->status = 1;
                    $data->finish_time = date("Y-m-d H:i:s");
                    $data->save();
                    $this->backBonus($pk);
                    return response()->json($data, 204);
                } elseif ($data->is_confirm && $data->accept && ($data->trans_status == 1)) {
                    //已经接单 但是未配送 通知商家处理
                    DB::beginTransaction();
                    try {
                        BusinessMessage::create(['user_id' => $data->business_id, 'message_code' => 2, 'num' => $data->id]);
                        $data->is_revoke = 2;
                        $data->save();
                        DB::commit();
                    }catch (\Exception $e){
                        DB::rollBack();
                        return response()->json('申请退单接口发生异常 请重试', 416);
                    }
                    return response()->json('已经通知商家确认退单', 205);
                } elseif ($data->is_confirm && $data->accept && ($data->trans_status != 1)) {
                    return response()->json('订单已经在配送了 无法取消', 414);
                }
            }
            return response($data, 500);
        }
        //这里是商家修改订单逻辑
        if($request->user_type==2) {
            if(Order::where(['business_id' => $request->user_id, 'id' => $pk])->count() < 1)
                return response()->json('该商家无权修改该订单',421);
            $data = Order::find($pk);
            if ($data->active == 0) {
                return response()->json('订单已经关闭',423);
            }
            //收单逻辑
            if($request->has('accept')){
                //商家确认收到逻辑
                if($request->get('accept') == 1) {
                    if ($data->accept == 1) {
                        return response()->json('该订单已经收单,无需重复操作', 422);
                    } else {
                        DB::beginTransaction();
                        try {
                            $data->accept = 1;
                            $data->save();
                            UserMessage::create(['user_id' => $data->user_id, 'message_code' => 3, 'num' => $data->id]);
                            DB::commit();
                            return response()->json('操作成功', 221);
                        } catch (\Exception $e) {
                            DB::rollBack();
                            return response()->json('操作失败 请重试', 223);
                        }
                    }
                }elseif($request->get('accept') == 0){
                    if ($data->active == 0) {
                        return response()->json('订单已经关闭 无限拒绝该订单', 430);
                    } else {
                        DB::beginTransaction();
                        try {
                            $data->accept = 2;
                            $data->active = false;
                            $data->status = 1;
                            $data->finish_time = date("Y-m-d H:i:s");
                            $data->because =$request->get('because');
                            $data->save();
                            $this->backBonus($data->id);
                            UserMessage::create(['user_id' => $data->user_id, 'message_code' => 4, 'num' => $data->id]);
                            DB::commit();
                            return response()->json('拒绝订单成功', 222);
                        } catch (\Exception $e) {
                            DB::rollBack();
                            return response()->json($e->getMessage(), 431);
                        }
                    }
                }
            }
            //商家接受或拒绝用户退单请求
            if($request->has('revoke')){
                //用户要确认订单 同时商家也要确认订单 并且用户申请退单才行执行该操作
                if( ($data->accept !=1) || ($data->is_confirm !=1) ||($data->trans_status!=1)||($data->is_revoke!=1)){
                    return response()->json('订单正在运输中或者商家未接受订单或者用户并未申请订单 请再次确认订单状态',423);
                }else{
                    $revoke = $request->get('revoke');
                    if($revoke == 1) {
                        DB::beginTransaction();
                        try{
                        //商家接受用户退单的请求 原路返回优惠券和商品 并且关闭这个订单
                            UserMessage::create(['user_id' => $data->user_id, 'message_code' => 7, 'num' => $data->id]);
                        $data->active = 0;
                        $data->is_revoke=1;
                        $data->finish_time = date("Y-m-d H:i:s");
                        $this->backBonus($data->id);
                        $data->save();
                        DB::commit();
                        }catch (\Exception $e){
                            DB::rollBack();
                            return response()->json('接受退单操作失败 请重试',428);
                        }
                    }else{
                        DB::beginTransaction();
                        try {
                            UserMessage::create(['user_id' => $data->user_id, 'message_code' => 8, 'num' => $data->id]);
                            $data->is_revoke = 3;
                            $data->active = 0;
                            $data->save();
                            DB::commit();
                        }catch (\Exception $e){
                            DB::rollBack();
                            return response()->json('拒绝退单操作失败 请重试',429);
                        }
                    }
                    return response()->json('操作成功',221);
                }
            }
            //商家修改订单运输状态
            if($request->has('trans_status')){
                if($data->accept !=1){
                    return response()->json('请先收单在运输',424);
                }
                $trans_status = $request->get('trans_status');
                if(in_array($trans_status,array(1,2,3))){
                    DB::beginTransaction();
                    try {
                        $data->trans_status = $trans_status;
                        $data->save();
                        UserMessage::create(['user_id' => $data->user_id, 'message_code' => 5, 'num' => $data->id]);
                        DB::commit();
                        return response()->json('操作成功',221);
                    }catch (\Exception $e){
                        DB::rollBack();
                        return response()->json('发货失败 请重试',432);
                    }
                }else{
                    return response()->json('无法识别的运输状态',425);
                }
            }

            //商家确认订单完成 商家要先完成订单配送再确认完成订单
            if($request->get('status')==1){
                if($data->trans_status != 3){
                    return response()->json('请先完成配送再完成订单',426);
                }
                DB::beginTransaction();
                try {

                    $data->status = 1;
                    $data->active = 0;
                    $data->finish_time = date("Y-m-d H:i:s");
                    $data->save();
                    //商家修改销量
                    $row=Business::where('id',$data['business_id'])->first();
                    $sales=$row['sales']+1;
                    $row['sales'] =$sales;
                    $row->save();
                    //食品销量
                    $food=OrderGoods::where('order_id',$pk)->get();
                    foreach ($food as $v){
                        $foo= Food::find($v['good_id']);
                        $num=$foo['num']+$v['num'];
                        $foo->num=$num;
                        $foo->save();
                    }

                   DB::commit();
                    UserMessage::create(['user_id' => $data->user_id, 'message_code' => 6, 'num' => $data->id]);
                   return response()->json('订单已经完成',221);
               }catch (\Exception $e){
                  DB::rollBack();
                    return response()->json($e->getMessage(),433);
                }
            }
        }
    }

    //退回优惠券和商品库存接口
    //从订单中把订单中的优惠券原路返回
    //把订单中的商品库存信息原路返回
    public function backBonus($orderId)
    {
        if(OrderGoods::where(['order_id'=>$orderId])->count() <1)
        {
            return false;
        }
        $orderGoods = OrderGoods::where(['order_id'=>$orderId])->first();
        $goodId = $orderGoods->good_id;
        $goodNum = $orderGoods->num;
        if(Food::where(['id'=>$goodId])->count()>0){
            $good = Food::find($goodId);
            $good->food_num += $goodNum;
            $good->save();
        }
        $order = Order::find($orderId);
        $bonusId = $order->bonus_id;
        //返回优惠券 如果用户已经有了优惠券 根据不能重复原则 就不返还券
        if($bonusId != null && (BonusRecord::where(['id'=>$bonusId])->count()>0)){
            $BonusRecord = BonusRecord::find($bonusId)->toArray();
            try{
            Bonus::create([
                'type'=>$BonusRecord['type'],
                'record_id'=>$BonusRecord['id'],
                'user_id'=>$BonusRecord['user_id'],
            ]);}
            catch (\Exception $e)
            {

            }
        }
        return true;
    }

    /**
     * 用户删除订单
     *
     * 前端逻辑
     * 1. 可以删除未确认的订单
     * 2. 完成的订单可以删除
     * 3. 其他订单正在执行 不能删除
     *
     * 414 该订单不属于该用户
     * 200 成功
     * 411 订单目前无法删除 还在进行之中
     */
    public function destroy(Request $request,$pk)
    {
        if($request->user_type == 1) {
            $data=Order::where(['user_id'=>$request->user_id,'id'=>$pk])->count();

        }
        if($request->user_type == 2) {
            $data=Order::where(['business_id'=>$request->user_id,'id'=>$pk])->count();
        }
        if($request->user_type == 3) {
            $data=Order::where(['id'=>$pk])->count();
        }
        if($data<1)
        {
            return response()->json('未找到订单',414);
        }
        $order = Order::find($pk);
        if($order->status == 1 && $order->active ==0)
        {
            if ($request->user_type ==1){
                $order->user_delete =1;
                $order->save();
            }
            if ($request->user_type ==2){
                $order->business_delete =1;
                $order->save();
            }
            if ($request->user_type ==3){
                $order->delete();
            }
            return response()->json("删除成功",200);
        }
        return response()->json("订单目前无法删除",411);
    }
}
